#ifndef PROGRAM_H
#define PROGRAM_H

#include"list.h"
#include"thread.h"

//PCB 起始地址 = 原地址 - 偏移地址
#define ListItemToPCB(ADDRESS,LIST_ITEM) ((PCB*)((int)(ADDRESS) - (int)&((PCB*)0)->LIST_ITEM))

class ProgramManager
{
public:
    List allPrograms;   //所有状态的线程/进程队列
    // List readyPrograms;
    List readyPrograms[MAX_QUEUE_SIZE]; //可以考虑一个队列对应多个优先级,数字大优先级高
    PCB* running;   //当前运行线程

    ProgramManager();   //初始化
    void initialize();
    //创建一个线程并放入就绪队列，function 执行函数、parameter 指向函数参数指针，name 线程名，priority 优先级
    //成功返回 pid ，失败返回 -1
    int executeThread(ThreadFunction function,void* parameter,const char* name,int priority=1);
    PCB* allocatePCB(); //分配一个PCB      
    void releasePCB(PCB*  program); //归还一个 PCB
    void schedule_round_robin();   //执行线程调度   
    void schedule_first_in_first_out(); 
    void schedule_multilevel_feedback_queue(); 
    void age(); //老化机制，长时间等待线程提高优先级
    void MESA_WakeUp(PCB* program);
    void Hasen_WakeUp(PCB* program);
    void Hoare_WakeUp(PCB* program);
};
void program_exit();

#endif